
var MongoDB =  require('mongodb');

var MongoClient = MongoDB.MongoClient;

const ObjectID = MongoDB.ObjectID;

var Config = require('./config.js');



class Db{

    static getInstance(){  /*单例：多次实例化实例不共享的问题*/

        if(!Db.instance){
            Db.instance = new Db();
        }

        return Db.instance;
    }

    constructor(){

        this.dbClient = '';  /* 属性 放db对象 */

        this.connect(); /* 初始化连接数据库 */
    }

    /* 连接数据库 */
    connect(){

        let _that = this;
        return new Promise((resolve,reject)=>{

            if(!_that.dbClient){  /* 解决数据库多次连接问题 */

                MongoClient.connect(Config.dbUrl,{ useUnifiedTopology: true },(err,client)=>{

                    if(err){
                        
                        reject(err);
    
                    }else{
    
                        _that.dbClient = client.db(Config.dbName);
        
                        resolve(_that.dbClient)
                    }
                })
            }else{
                resolve(_that.dbClient)
            }
            
        })
        
    }

    /*查询数据*/
    find(collectionName,json){
        return new Promise((resolve,reject)=>{

            this.connect().then((db)=>{

                let result = db.collection(collectionName).find(json);

                result.toArray((err,docs)=>{
                    if(err){
                        reject(err);
                        return;
                    }
                    resolve(docs);
                })
    
            })
        })
       
    }

    /* 修改数据 */
    update(collectionName,json1,json2){

        return new Promise((resolve,reject)=>{

            this.connect().then((db)=>{
                db.collection(collectionName).updateOne(json1,{
                    $set:json2             
                },(err,result)=>{
                    if(err){
                        reject(err);
                    }else{
                        resolve(result)
                    }
                })
            })    
        })

    }

    /* 增加数据 */
    insert(collectionName,json){
        
        return new Promise((resolve,reject)=>{

            this.connect().then((db)=>{

                db.collection(collectionName).insertOne(json,function(err,result){
                    
                    if(err){
                        reject(err);
                    }else{
                        resolve(result);
                    }
                })
            })
        })
    }

    /* 删除数据 */
    remove(collectionName,json){

        return new Promise((resolve,reject)=>{

            this.connect().then((db)=>{

                db.collection(collectionName).removeOne(json,function(err,result){
                    if(err){
                        reject(err);
                    }else{
                        resolve(result);
                    }
                })
            })
        })
    }

    /*  mongodb里面查询 _id 把字符串转换成对象*/
    getObjectId(id){

        return new ObjectID(id);
    }
}

module.exports=Db.getInstance();
